/*
 * Copyright 2015, The Querydsl Team (http://www.querydsl.com/team)
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * http://www.apache.org/licenses/LICENSE-2.0
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.querydsl.spatial;

import com.querydsl.core.types.Operator;

/**
 * {@code SpatialOps} provides {@link Operator} instances for spatial operations
 *
 * @author tiwe
 *
 */
public enum SpatialOps implements Operator {

    // Geometry
    DIMENSION(Integer.class),
    GEOMETRY_TYPE(String.class),
    AS_TEXT(String.class),
    AS_BINARY(Object.class),
    SRID(Integer.class),
    SRID2(Integer.class),
    IS_EMPTY(Boolean.class),
    IS_SIMPLE(Boolean.class),
    BOUNDARY(Object.class),
    ENVELOPE(Object.class),
    WKTTOSQL(Object.class),
    WKBTOSQL(Object.class),
    EQUALS(Boolean.class),
    DISJOINT(Boolean.class),
    INTERSECTS(Boolean.class),
    TOUCHES(Boolean.class),
    CROSSES(Boolean.class),
    WITHIN(Boolean.class),
    CONTAINS(Boolean.class),
    OVERLAPS(Boolean.class),
    RELATE(Boolean.class),
    DISTANCE(Number.class),
    DISTANCE2(Number.class),
    DISTANCE_SPHERE(Number.class),
    DISTANCE_SPHEROID(Number.class),
    INTERSECTION(Object.class),
    DIFFERENCE(Object.class),
    UNION(Object.class),
    SYMDIFFERENCE(Object.class),
    BUFFER(Object.class),
    BUFFER2(Object.class),
    CONVEXHULL(Object.class),
    TRANSFORM(Object.class),

    // Point
    X(Number.class),
    X2(Number.class),
    Y(Number.class),
    Y2(Number.class),
    Z(Number.class),
    Z2(Number.class),
    M(Number.class),
    M2(Number.class),

    // Curve
    START_POINT(Object.class),
    END_POINT(Object.class),
    IS_RING(Object.class),
    LENGTH(Object.class),
    LENGTH2(Object.class),

    // LineString
    NUM_POINTS(Integer.class),
    POINTN(Object.class),

    // Surface
    AREA(Number.class),
    AREA2(Number.class),
    CENTROID(Object.class),
    POINT_ON_SURFACE(Object.class),

    // Polygon
    EXTERIOR_RING(Object.class),
    EXTERIOR_RING2(Object.class),
    INTERIOR_RINGS(Object.class),
    INTERIOR_RINGS2(Object.class),
    NUM_INTERIOR_RING(Integer.class),
    INTERIOR_RINGN(Object.class),

    // Polyhedral Surface
    GEOMETRIES(Object.class),
    NUM_SURFACES(Integer.class),
    SURFACE(Object.class),

    // GeometryCollection
    NUM_GEOMETRIES(Integer.class),
    GEOMETRYN(Object.class),

    // MultiCurve
    IS_CLOSED(Boolean.class),

    // Extensions
    AS_EWKT(String.class),
    GEOM_FROM_TEXT(Object.class),
    SET_SRID(Object.class),
    XMIN(Number.class),
    XMAX(Number.class),
    YMIN(Number.class),
    YMAX(Number.class),
    DWITHIN(Boolean.class),
    EXTENT(Object.class),
    COLLECT(Object.class),
    COLLECT2(Object.class),
    TRANSLATE(Object.class),
    TRANSLATE2(Object.class);

    private final Class<?> type;

    private SpatialOps(Class<?> type) {
        this.type = type;
    }

    @Override
    public Class<?> getType() {
        return type;
    }
}